package models

import "fmt"

type Phone struct {
}
type Camera struct {
}
type Computer struct {
}

type Usb interface {
	//声明了两个没有实现的方法
	Start()
	Stop()
}

type Usb2 interface {
	//声明了两个没有实现的方法
	Start()
	Stop()
	Test()
}

// 让Phone 实现 Usb接口的方法
func (p Phone) Start() {
	fmt.Println("手机开始工作。。。")
}
func (p Phone) Stop() {
	fmt.Println("手机停止工作。。。")
}

// 让Camera 实现   Usb接口的方法
func (c Camera) Start() {
	fmt.Println("相机开始工作~~~。。。")
}
func (c Camera) Stop() {
	fmt.Println("相机停止工作。。。")
}

// 编写一个方法Working 方法，接收一个Usb接口类型变量
// 只要是实现了 Usb接口
// （所谓实现Usb接口，就是指实现了 Usb接口声明所有方法）
// (c Computer)---->用computer对象
func (c Computer) Working(usb Usb) {
	//通过usb接口变量来调用Start和Stop方法
	usb.Start()
	usb.Stop()
}

// =======================================================================
type AInterface interface {
	Say()
}

type BInterface interface {
	Hello()
}

type Stu struct {
	Name string
}

func (stu Stu) Say() {
	fmt.Println("Stu Say()")
}

type Integer int

func (i Integer) Say() {
	fmt.Println("integer Say i =", i)
}

type Monster struct{}

func (m Monster) Hello() {
	fmt.Println("Monster Hello()~~")
}

func (m Monster) Say() {
	fmt.Println("Monster Say()~~")
}

// ====================================================
type DInterface interface {
	test01()
}

type CInterface interface {
	test02()
}

type FInterface interface {
	DInterface
	CInterface
	test03()
}

// 如果需要实现AInterface,就需要将BInterface CInterface的方法都实现
type StuA struct {
}

func (stu StuA) test01() {}
func (stu StuA) test02() {

}
func (stu StuA) test03() {}

type T interface {
}

//============================================================

// Monkey结构体
type Monkey struct {
	Name string
}

// 声明接口
type BirdAble interface {
	Flying()
}

type FishAble interface {
	Swimming()
}

func (this *Monkey) climbing() {
	fmt.Println(this.Name, " 生来会爬树..")
}

// LittleMonkey结构体
type LittleMonkey struct {
	Monkey //继承
}

// 让LittleMonkey实现BirdAble
func (this *LittleMonkey) Flying() {
	fmt.Println(this.Name, " 通过学习，会飞翔...")
}

// 让LittleMonkey实现FishAble
func (this *LittleMonkey) Swimming() {
	fmt.Println(this.Name, " 通过学习，会游泳..")
}
